package com.zmn.plat.persistence.interfaces.area;

import com.zmn.common.dictionary.DictModel;
import com.zmn.common.dto.AreaDTO;
import com.zmn.common.dto.VtDTO;
import com.zmn.mcc.permit.mysql.annotation.ZmnDPermitConfig;
import com.zmn.mcc.permit.mysql.annotation.ZmnDPermitType;
import com.zmn.mcc.permit.mysql.enums.DPermitTypeEnum;
import com.zmn.plat.common.dto.KVDTO;
import com.zmn.plat.model.entity.area.AreaQuery;
import com.zmn.plat.model.entity.area.BaseArea;
import com.zmn.plat.model.vo.area.AreaSimpleVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author nowind
 * @since 17/10/30 11:09
 * @modifier tanbiao 20190909 新增状态更新和排序更新的接口方法
 */
public interface AreaDao {

    /**
     * 根据城市ID查询城市贺省份信息
     *
     * @param cityId 区域ID
     * @return AreaDRO 区域DRO实体
     */
    BaseArea findCityAndProvinceByCityId(Integer cityId);

    /**
     * 主键查询
     *
     * @param areaId
     * @return
     */
    BaseArea findByKey(Integer areaId);

    /**
     * 根据查询条件查询第一条数据
     *
     * @param query
     * @return
     */
    BaseArea findFristByQuery(AreaQuery query);

    /**
     * 描述: 根据区域Code查询区域
     *
     * @param code
     * @return area
     * @auther tanghongjun
     * @since 2019/4/20 9:56
     */
    BaseArea findByCode(Integer code);

    /**
     * 主键查询
     *
     * @param areaIds
     * @return
     */
    List<BaseArea> findByKeys(@Param("ids") List<Integer> areaIds);

    /**
     * 查询省
     * 查数据权限
     *
     * @param deptId 部门
     * @return
     */
    List<VtDTO> findProvinceFromPermitDataByDeptId(Integer deptId);

    /**
     * 查询城市
     * 查数据权限
     *
     * @param deptId 部门
     * @return
     */
    List<AreaDTO> findCityFromPermitDataByDeptId(Integer deptId);

    /**
     * 分页查询
     *
     * @param query
     * @return
     */
    @ZmnDPermitConfig(alias = "base_area", types = {}
            , mapping = {@ZmnDPermitType(type = DPermitTypeEnum.COUNTY, column = "area_id"),
            @ZmnDPermitType(type = DPermitTypeEnum.PROVINCE, column = "area_id"),
            @ZmnDPermitType(type = DPermitTypeEnum.PROVINCE, column = "area_id")}, staffId = "query.operatorId")
    List<BaseArea> listPageByQuery(AreaQuery query);

    /**
     * 查询所有区域VTDTO (仅用于初始化区域首字母和简拼)
     * @return
     */
    List<VtDTO> listAllVtDto();

    /**
     * 分页查询区域，数据权限根据城市过滤
     *
     * @param query
     * @return
     */
    @ZmnDPermitConfig(alias = "base_area", types = {}
            , mapping = { @ZmnDPermitType(type = DPermitTypeEnum.PROVINCE, column = "parent_id")}, staffId = "query.operatorId")
    List<BaseArea> listCountyPageByQueryOfPermitCity(AreaQuery query);

    /**
     * 搜索
     *
     * @param query
     * @return
     */
    @ZmnDPermitConfig(alias = "base_area", types = {}
            , mapping = {@ZmnDPermitType(type = DPermitTypeEnum.COUNTY, column = "area_id"),
            @ZmnDPermitType(type = DPermitTypeEnum.CITY, column = "area_id"),
            @ZmnDPermitType(type = DPermitTypeEnum.PROVINCE, column = "area_id")}, staffId = "query.operatorId")
    List<BaseArea> listByQuery(AreaQuery query);

    /**
     * 取得指定等级及以上的区域列表
     * @param query 状态
     * @return
     */
    List<BaseArea> listAboveByLevel(AreaQuery query);

    /**
     * 搜索
     *
     * @param query
     * @return
     */
    List<AreaDTO> listProCityByQuery(AreaQuery query);

    /**
     * 查询区/县及上级ID/NAME
     *
     * @param provinceId 省
     * @param cityId     市
     * @param countyName 区
     * @return
     */
    List<BaseArea> listCounty(@Param("provinceId") Integer provinceId, @Param("cityId") Integer cityId, @Param("name") String countyName);

    /**
     * 查询区/县及上级ID/NAME
     *
     * @param provinceId 省
     * @param cityId     市
     * @param countyId   区
     * @param streetName 街道
     * @return
     */
    List<BaseArea> listStreet(@Param("provinceId") Integer provinceId, @Param("cityId") Integer cityId, @Param("countyId") Integer countyId
            , @Param("name") String streetName);

    /**
     * 根据城市名称集合查询城市和省份信息
     *
     * @param areaNameList 区域名称集合
     * @return BaseArea集合
     */
    List<BaseArea> listProvinceAndCityByCityNameList(@Param("areaNameList") List<String> areaNameList);

    /**
     * 根据层级查询
     *
     * @param level 等级
     * @return
     */
    List<DictModel> listAllByLevel(@Param("level") Integer level);

    /**
     * 查询区域
     *
     * @param ids id's
     * @return
     */
    List<BaseArea> listAreaByIds(Integer[] ids);

    /**
     * 查询区域
     *
     * @param ids 父ID
     * @return
     */
    @ZmnDPermitConfig(alias = "base_area", types = {}
            , mapping = {@ZmnDPermitType(type = DPermitTypeEnum.CITY, column = "parent_id") ,@ZmnDPermitType(type = DPermitTypeEnum.COUNTY, column = "area_id")}, staffId = "staffId")
    List<BaseArea> listByParentIds(@Param("ids") Integer[] ids, @Param("staffId") Integer staffId);

//    /**
//     * 查询公司开通省
//     *
//     * @param companyId 公司
//     * @return
//     */
//    List<DictModel> listProvinceByCompanyId(int companyId);

    /**
     * 通过渠道ID获取服务区域下开通的城市
     *
     * @param channelId 渠道ID
     * @return
     */
    List<AreaDTO> listByChannelId(Integer channelId);

    /**
     * 通过渠道ID查询开通的城市，以及城市对应的省名称，ID，首字母
     * @param channelId
     * @return
     */
    List<AreaSimpleVO> listAreaByChannelId(Integer channelId);

    /**
     * 查询所有城市，以及城市对应的省名称，ID，首字母
     * @return
     */
    List<AreaSimpleVO> listAllCitySimpleVo();

    /**
     * 通过渠道ID,服务分类ID获取服务区域下开通的城市
     *
     * @param channelId   渠道ID
     * @param showType    产品分类 1后台 2前台
     * @param servCategId 服务分类ID
     * @return
     */
    List<AreaDTO> listByChannelIdAndServCategId(@Param("channelId") Integer channelId, @Param("showType") Integer showType, @Param("servCategId") Integer servCategId);

    /**
     * 搜索统计
     *
     * @param query 条件
     * @return
     */
    @ZmnDPermitConfig(alias = "base_area", types = {}
            , mapping = {@ZmnDPermitType(type = DPermitTypeEnum.COUNTY, column = "area_id"),
            @ZmnDPermitType(type = DPermitTypeEnum.PROVINCE, column = "area_id"),
            @ZmnDPermitType(type = DPermitTypeEnum.PROVINCE, column = "area_id")}, staffId = "query.operatorId")
    Integer countByQuery(AreaQuery query);

    /**
     * 分页查询区域，数据权限根据城市过滤
     *
     * @param query
     * @return
     */
    @ZmnDPermitConfig(alias = "base_area", types = {}
            , mapping = { @ZmnDPermitType(type = DPermitTypeEnum.PROVINCE, column = "parent_id")}, staffId = "query.operatorId")
    Integer countCountyPageByQueryOfPermitCity(AreaQuery query);

    /**
     * 更新状态
     *
     * @param BaseArea
     * @return
     */
    Integer updateStatusByKey(BaseArea BaseArea);

    /**
     * 更新首字母
     *
     * @param baseArea 条件
     * @return
     */
    Integer updateFirstLetterByKey(BaseArea baseArea);

    /**
     * 更新简拼
     * @param baseArea 条件
     * @return
     */
    Integer updateSimpleSpellByKey(BaseArea baseArea);

    /**
     * 更新状态：批量
     *
     * @param ids
     * @param status
     * @param mcStaffName
     * @return
     */
    Integer updateBatchStatusByKey(@Param("ids") List<Integer> ids, @Param("status") Integer status, @Param("staffName") String mcStaffName);

    /**
     * 批量更新区域首字母和简拼
     * @param areaList
     * @return
     */
    Integer updateFirstLetterAndSimpleSpellByKeyBatch(@Param("areaList") List<BaseArea> areaList);

    /**
     * 更新排序
     *
     * @param baseArea
     * @return
     */
    Integer updateSortByKey(BaseArea baseArea);

    /***
     * 更新
     * @param area 区域
     * @return
     */
    Integer updateByKey(BaseArea area);

    /**
     * 更新GB码
     *
     * @param area
     * @return
     */
    Integer updateCodeByKey(BaseArea area);

    /**
     * 插入
     *
     * @param area 区域
     * @return
     */
    Integer insert(BaseArea area);

    /**
     * 删除
     *
     * @param areaId 区域ID
     * @return
     */
    Integer deleteByKey(Integer areaId);

}
